package zhu.yu.OOP_abstract_class.finalAnd内部类;
/*
final 关键字代表最终、不可改变的

常见四种用法：
1. 可以用来修饰一个类
2. 可以用来修饰一个方法
3. 可以用来修饰一个局部变量
4. 可以用来修饰成员变量

不管修饰哪一种都是不可变的
 */
public class DemoFinal {

    public static void main(String[] args) {
        int num = 10;
        System.out.println(num);  // 10
        num = 20;
        System.out.println(num);  // 20

        // 一旦使用final修饰局部变量，那么这个变量就不能进行更改
        // "一次赋值，终身不变"
        final int num2 = 200;
        System.out.println(num2);  // 200

//        num2 = 201;  // 错误写放，不能改变
//        num2 = 200;  // 错误写放，不能改变，就算值不变也不行

        // 正确写法，只要保证有唯一一次赋值即可
        final int num3;
        num3 = 22;
        System.out.println(num3); // 22

        // 对于基本类型来说，不可变说的是变量当中的数据不可改变
        // 对于引用类型来说，不可变说的是变量当中的地址值不可改变, 数据可变

        DemoStudent demoStudent = new DemoStudent("小明");
        System.out.println(demoStudent.getName()); // 小明
        System.out.println(demoStudent);  // @282ba1e

        demoStudent = new DemoStudent("小红");
        System.out.println(demoStudent.getName()); // 小红
        System.out.println(demoStudent);  // @13b6d03
        // 地址值方式发生改变
        System.out.println("===============");

        final DemoStudent demoStudent1 = new DemoStudent("小花");  // 小花
        System.out.println(demoStudent1.getName());
        // 错误写法，final 的引用类型变量，其中的地址值不可改变
//        demoStudent1 = new DemoStudent("小强");
        // 但是引用类型的数据是可以改变的
        demoStudent1.setName("小强");
        System.out.println(demoStudent1.getName());  // 小强
    }
}
